package db

import (
	"fmt"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

// MySQLConfig MySQL数据库配置
type MySQLConfig struct {
	Host         string        `yaml:"host"`
	Port         int           `yaml:"port"`
	User         string        `yaml:"user"`
	Password     string        `yaml:"password"`
	DatabaseName string        `yaml:"database_name"`
	MaxOpenConns int           `yaml:"max_open_conns"`
	MaxIdleConns int           `yaml:"max_idle_conns"`
	MaxLifetime  time.Duration `yaml:"max_lifetime"`
}

// DefaultMySQLConfig 默认MySQL配置
func DefaultMySQLConfig() MySQLConfig {
	return MySQLConfig{
		Host:         "localhost",
		Port:         3306,
		User:         "root",
		Password:     "password",
		DatabaseName: "battle",
		MaxOpenConns: 10,
		MaxIdleConns: 5,
		MaxLifetime:  time.Hour,
	}
}

// GetMySQLDSN 获取MySQL连接字符串
func (c MySQLConfig) GetMySQLDSN() string {
	return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=true&loc=Local",
		c.User, c.Password, c.Host, c.Port, c.DatabaseName)
}

var (
	// MySQLDB 全局MySQL数据库连接
	MySQLDB *sqlx.DB
	// CurrentMySQLConfig 当前MySQL配置
	CurrentMySQLConfig MySQLConfig
)

// InitMySQL 初始化MySQL连接
func InitMySQL(config MySQLConfig) error {
	// 保存当前配置
	CurrentMySQLConfig = config
	log.Printf("MySQL配置: %+v", CurrentMySQLConfig)

	// 检查配置参数
	if CurrentMySQLConfig.Host == "" {
		return fmt.Errorf("MySQL主机地址不能为空")
	}

	if CurrentMySQLConfig.Port == 0 {
		CurrentMySQLConfig.Port = 3306 // 使用默认端口
		log.Println("未指定MySQL端口，使用默认端口3306")
	}

	// 确保数据库名称设置正确
	if CurrentMySQLConfig.DatabaseName == "" {
		log.Println("警告: 未指定数据库名称")
	}

	// 设置连接池参数
	if CurrentMySQLConfig.MaxOpenConns == 0 {
		CurrentMySQLConfig.MaxOpenConns = 10
		log.Println("未指定最大连接数，使用默认值10")
	}

	if CurrentMySQLConfig.MaxIdleConns == 0 {
		CurrentMySQLConfig.MaxIdleConns = 5
		log.Println("未指定最大空闲连接数，使用默认值5")
	}

	if CurrentMySQLConfig.MaxLifetime == 0 {
		CurrentMySQLConfig.MaxLifetime = time.Hour
		log.Println("未指定连接最大生命周期，使用默认值1小时")
	}

	dsn := config.GetMySQLDSN()
	db, err := sqlx.Connect("mysql", dsn)
	if err != nil {
		return fmt.Errorf("无法连接MySQL数据库: %w", err)
	}

	// 设置连接池参数
	db.SetMaxOpenConns(CurrentMySQLConfig.MaxOpenConns)
	db.SetMaxIdleConns(CurrentMySQLConfig.MaxIdleConns)
	db.SetConnMaxLifetime(CurrentMySQLConfig.MaxLifetime)

	// 不再需要显式选择数据库，因为DSN中已包含

	MySQLDB = db
	log.Println("MySQL数据库连接成功")
	return nil
}

// CloseMySQLConnection 关闭MySQL连接
func CloseMySQLConnection() {
	if MySQLDB != nil {
		MySQLDB.Close()
		log.Println("MySQL数据库连接已关闭")
	}
}
